const express = require('express');
const nunjucks = require('nunjucks');
const chokidar = require('chokidar');
const { SERVER_CONFIG, VIEW_ROOT, VERSION, MARKDOWN_ROOT } = require('./config/config');
const WebController = require('./controller/WebController');
const controller = new WebController();

const app = express();

(() => {
    // 路由配置
    // link: [Express 教程 4：路由和控制器](https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Express_Nodejs/routes)
    // 注意，连字符（-）和点（.）在字符串路径中解释为字面量，不能做为正则表达式
    // ?：问号之前的一个字符只能出现零次或一次。例如，路由路径 '/ab?cd' 路径匹配端点 acd 或 abcd。
    // +：加号之前的一个字符至少出现一次。例如，路径路径 '/ab+cd' 匹配端点 abcd、abbcd、abbbcd，等。
    // *：星号可以替换为任意字符串。例如，路由路径 '/ab*cd' 匹配端点 abcd、abXcd、abSOMErandomTEXTcd，等。
    // ()：将一个字符串视为一体以执行 ?、+、* 操作。例如。 '/ab(cd)?e' 将对 (cd) 进行匹配，将匹配到 abe 和 abcde。
    // 重要参数：req.url, req.params
    app.get('/', function (req, res) {
        // 默认首页（匹配 "/"）
        // res.send('/');
        controller.index(req, res);
    })
    app.get('/index.html', function (req, res) {
        // 首页（匹配 "/index.html"）
        // res.send('/index.html');
        controller.index(req, res);

    })
    app.get('/index-:page.html', function (req, res) {
        // 首页列表分页（匹配 "/index-1.html"）
        // res.send(`/index-${req.params.page}.html`);
        controller.index(req, res);
    })
    app.get('/tag/:tag.html', function (req, res) {
        // 标签首页（匹配 "/tag/xxx.html")
        controller.tag(req, res);
    })
    app.get('/tag/:tag-:page.html', function (req, res) {
        // 标签首页（匹配 "/tag/xxx-1.html")
        controller.tag(req, res);
    })
    app.get('/:cat1/index.html', function (req, res) {
        // 一级分类首页（匹配 "/xxx/index.html"）
        // res.send(`/${req.params.cat1}/index.html`);
        controller.list(req, res);
    })
    app.get('/:cat1/index-:page.html', function (req, res) {
        // 一级分类首页列表分页（匹配 "/xxx/index-1.html"）
        // res.send(`/${req.params.cat1}/index-${req.params.page}.html`);
        controller.list(req, res);
    })
    app.get('/:cat1/:title.html', function (req, res) {
        // 一级分类详情页（匹配 "/xxx/xxx.html"）
        // res.send(`/${req.params.cat1}/detail.html`);
        controller.detail(req, res);
    })
    app.get('/:cat1/:cat2/index.html', function (req, res) {
        // 二级分类首页（匹配 "/xxx/xxx/index.html"）
        // res.send(`/${req.params.cat1}/${req.params.cat2}/index.html`);
        controller.list(req, res);
    })
    app.get('/:cat1/:cat2/index-:page.html', function (req, res) {
        // 二级分类首页列表分页（匹配 "/xxx/xxx/index-1.html"）
        // res.send(`/${req.params.cat1}/${req.params.cat2}/index-${req.params.page}.html`);
        controller.list(req, res);
    })
    app.get('/:cat1/:cat2/:title.html', function (req, res) {
        // 二级分类详情页（匹配 "/xxx/xxx/xxx.html"）
        // res.send(`/${req.params.cat1}/${req.params.cat2}/detail.html`);
        controller.detail(req, res);
    })
    app.get('/new.html', function (req, res) {
        // 最新栏目首页（匹配 "/new.html"）
        // res.send('/new.html');
        controller.new(req, res);
    })
    app.get('/new-:page.html', function (req, res) {
        // 最新栏目首页列表分页（匹配 "/new-1.html"）
        // res.send(`/new-${req.params.page}.html`);
        controller.new(req, res);
    })
    app.get('/recommand.html', function (req, res) {
        // 推荐栏目首页（匹配 "/recommand.html"）
        // res.send('/recommand.html')
        controller.recommand(req, res);
    })
    app.get('/recommand-:page.html', function (req, res) {
        // 推荐栏目首页列表分页（匹配 "/recommand-1.html"）
        // res.send(`/recommand-${req.params.page}.html`);
        controller.recommand(req, res);
    })
    app.get('/search.html', function (req, res) {
        // 搜索结果页面
        // res.send('search');
        controller.search(req, res);
    })
    app.get('/about.html', function (req, res) {
        // 关于我们页面
        // res.send('about')
        controller.about(req, res);
    })
    app.get('/concatus.html', function (req, res) {
        // 联系我们页面
        // res.send('concatus')
        controller.concat(req, res);
    })
    app.get('/release.html', function (req, res) {
        // 版本发行页面
        // res.send('release');
        controller.release(req, res);
    })
    app.get('/help.html', function (req, res) {
        // 帮助页面
        // res.send('help');
        controller.help(req, res);
    })
})()

// 静态目录配置
app.use(express.static('./content/public'));

// 模板引擎配置
nunjucks.configure(VIEW_ROOT, {
    autoescape: false,
    express: app,
    watch: true,
});

//设置跨域访问（设置在所有的请求前面即可）
app.all("*", function (req, res, next) {
    //设置允许跨域的域名，*代表允许任意域名跨域
    res.header("Access-Control-Allow-Origin", "*");
    //允许的header类型
    res.header("Access-Control-Allow-Headers", "content-type");
    //跨域允许的请求方式 
    res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
    if (req.method == 'OPTIONS') {
        res.sendStatus(200); //让 options 尝试请求快速结束
    } else {
        next();
    }
});

// 处理 404 页面
app.use(function (req, res) {
    req.url = decodeURIComponent(req.url);
    console.log('公共请求信息（路由配置没有生效的时候最终进入这里）', req.url, req.query);
    res.send('<h4>404</h4><h2>抱歉，页面不存在</h2>请求路径：' + req.url);
})

app.listen(SERVER_CONFIG.port, () => {
    console.log('server start on ' + SERVER_CONFIG.domain);
    console.log('Powerd by MdBlog ' + VERSION);
})

/**
 * 等 npm run dev 启动 5 秒后再监听文件变化
 */
let done = true, enable = true;
if (enable) {
    chokidar.watch(MARKDOWN_ROOT).on('all', (event, path) => {
        if (done) {
            done = false;
            setTimeout(async () => {
                console.log('[监听文件变化]', event, path);
                await controller.buildCache();
                done = true;
            }, 1000)
        }
    });
}
